{
 "metadata": {
  "name": "",
  "signature": "sha256:0828804158567845685ea9601c9d99e47141b0df7788b6d6f9994d4a5344cb31"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "%matplotlib inline\n",
      "import numpy as np\n",
      "import matplotlib.pyplot as plt"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from sklearn.datasets import fetch_mldata\n",
      "\n",
      "\n",
      "def load_data(dtype=np.float32, order='F'):\n",
      "    # Load dataset\n",
      "    print(\"Loading dataset...\")\n",
      "    data = fetch_mldata('MNIST original')\n",
      "    X, y = data.data, data.target\n",
      "    if order.lower() == 'f':\n",
      "        X = np.asfortranarray(X)\n",
      "\n",
      "    # Normalize features to 0-1 range\n",
      "    X = X.astype('float64')\n",
      "    X = X / 255\n",
      "\n",
      "    # Create train-test split (as [Joachims, 2006])\n",
      "    print(\"Creating train-test split...\")\n",
      "    n_train = 60000\n",
      "\n",
      "    X_train = X[:n_train]\n",
      "    y_train = y[:n_train]\n",
      "    X_test = X[n_train:]\n",
      "    y_test = y[n_train:]\n",
      "\n",
      "    return X_train, X_test, y_train, y_test\n",
      "\n",
      "X_train, X_test, y_train, y_test = load_data(order='C')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "Loading dataset...\n",
        "Creating train-test split..."
       ]
      },
      {
       "output_type": "stream",
       "stream": "stdout",
       "text": [
        "\n"
       ]
      }
     ],
     "prompt_number": 2
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def plot_images(images, n_rows=10, n_cols=10, ordering=None):\n",
      "    if ordering is None:\n",
      "        indices = np.arange(len(images))\n",
      "    else:\n",
      "        indices = ordering.argsort()[::-1]\n",
      "    plt.figure(figsize=(1.2 * n_cols, 1.2 * n_rows))\n",
      "    plt.gray()\n",
      "    for i in range(n_rows):\n",
      "        for j in range(n_cols):\n",
      "            idx = i * n_cols + j\n",
      "            if idx < len(images):\n",
      "                idx = indices[idx]\n",
      "                plt.subplot(n_rows, n_cols, i * n_cols + j + 1)\n",
      "                plt.imshow(images[idx].reshape(28, 28), interpolation='nearest')\n",
      "                plt.axis('off')\n",
      "                if ordering is not None:\n",
      "                    plt.title(\"{:.2f}\".format(ordering[idx]))\n",
      "                \n",
      "plot_images(X_train, n_rows=3)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAArsAAADmCAYAAADV7E2CAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJztnXWgFOX7vi+7uwNFxe7ADsRAEQPFVuzGxMJExO4ubAUD\nC7Gbjx1gd/u1u1t/f/i7zzszZ3tnducs9/XPOWd3dubd90zez/Pczzj//vvvvxhjjDHGGNOCjNvs\nARhjjDHGGJMVvtk1xhhjjDEti292jTHGGGNMy+KbXWOMMcYY07L4ZtcYY4wxxrQsvtk1xhhjjDEt\ni292jTHGGGNMy+KbXWOMMcYY07L4ZtcYY4wxxrQs42e14nHGGSerVeeKahrQjQ1z4vmI4/mI4/lo\nT6Vz4vmI4/mI4/mI4/mIM7bPh5VdY4wxxhjTsvhm1xhjjDHGtCy+2TXGGGOMMS2Lb3aNMcYYY0zL\n4ptdY4wxxhjTsvhm1xhjjDHGtCyZWY81k6WXXhqAfv36AdC3b18ArrrqKgDOOeccAEaPHt2E0eWD\nbt26AfDAAw8AMO6448Zef+SRR5oxLNMk1l13XQBGjhwJwCeffALArrvuCsCzzz4LwJdfftmE0Rlj\n8kCnTp0AOO200wDYdNNNY++ffvrpAPTv37+xAzOmDFZ2jTHGGGNMyzLOv9W4vFez4iYYGC+xxBIA\nPPjggwBMOeWUBZf7/vvvAZhuuunq3mZHM8nffvvtAdh7770BWGyxxYCg7D7//PNAUMHPO+88AP76\n66+K1p/n+VhmmWXafn/mmWcA+Oeffwoue/TRRwMwePDguraZ5/mIImV3xIgRBd+//fbbAdh4443r\n2k5e50PHwUorrQSE/b4YGtt3330HwAorrND23uuvv17VtvNgCr/88ssDsOSSSwJBmZt77rkBWH31\n1YHGRHzyMB/FmGGGGQC45JJLAFh//fVj76d13ojSzPmQknv99dcD8f08ykcffRRbfvPNNwfghhtu\nSH1Medo/dB1RNLnY9eTNN98EYNtttwXggw8+AOCrr76qewx5mo8kq666KhD2i8MOOwyAhRZaCID/\n+7//A+DQQw8F4LbbbgPgp59+qnmbbiphjDHGGGPGOlpC2V122WUBuOmmmwCYddZZgXCH/+OPPwLw\nxx9/AEHRXXnllYF47q6WqZS8KlVJpOjqyVJPXELKbvLJtEuXLkB4Ei1HnudD6iRAz549geJP4uL8\n888Hwr41atSoqraZx/mYeuqpgfDdAFZZZRUAZp555oKfOeqoowA44YQT6tp2XuZD+7WU6t133x2A\nzp07A9WNE+DVV19t+32nnXYC4Omnn67os81QZqaddloAzj33XADWWGMNAKaffvqCy3/77bcAfPzx\nxwXfP+KIIwB47LHHAPjmm29qHlselao99tgDgB49egCw3nrrlVx+n332AeCCCy6oe9vNmA/l5B5w\nwAGx12+88UYgKP9SdDfbbDMgKMAiixzePOwfun5efvnlAMw555xA8etJ8vo6dOhQAA488ECgPoU3\nD/ORZO211wbgiiuuAGCmmWaq6HOKmOy7775tr/3+++9VbdvKrjHGGGOMGevwza4xxhhjjGlZOmQa\nw6STTgrAUkstBcA111wDwOyzzx7btr6a0hROPvlkAK677rrYcgrBQfVh2ryEZSGEp1WopxALhPDk\nxBNPHPuMimkUZplvvvli73fkNAaFpO+55x4gHqKffPLJgfJpDJoXhSXLFS4lydN8CIXgLrvssrbX\n5pprLqD8fPTp0wcIhQTV0uz5UNHqvffeC0DXrl0LbrOe0+IhhxwCwKmnnlrR8s0IQ+r/mAw7l9t2\nubHecsstAGyzzTZtr/32229VjS0PYdkVV1wRCOdQnTsqPW/oOyv9R+kiAH/++WdVY8l6PlQ8BCEN\nRa898cQTQEhnePLJJ0uu68MPP2y3TgjpDmeccUbsZy00c//QuVPXgfnnnx8ongYoir2vFEwVhtdC\nHo6XJL/88gsAE000UU2fl20sVJ8K5DQGY4wxxhgz1tEhm0pcdNFFAGy55ZYVLS8FWE/lss9RAwXZ\nDnVUNtpoIwB22WUXICSH62kSij9xnnLKKbFllSDeCow//n+7t+yTzH9MM800AEw22WRVf1bHnvan\naNFfHlG048wzzwSgV69eQJiDSlGRhAq1ihXy5R1ZjF188cWZrL93795AvMDkpJNOymRbWbDaaqsB\nIfpXrGCvHIo+KpoYpR5VM02kvkqNjSIlt9qxqoAtqQyrUE0/FYWFjtGAYoEFFgCC0p9Urqvl+OOP\nB4IlWasga75aVeSXXnoJCBGiNLGya4wxxhhjWpYOpezKuFm2L8mnBym2UpuUM6fWp2PGjAGCOtO9\ne/eC6+koKC/uyiuvLPh+VNktRvK7V/KZjsKgQYMqXlaquPYxWVG1AmeddRYQz4NKUun/XRYystrJ\n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\n/vnnn8YMNgdongDuvfdeIMyR7Er23ntvAM4777wGjy59VlppJQD++usvAJ566qlmDsd0QGaffXYA\nTjjhBAC23nprAL788ksAbrjhBgAOPfRQAH7++edGD7Gp7LHHHgCcf/75ALz99tsA7L777rHlvv/+\n+7bfn3322QaNLn1mnHFGAK688koA1lprLQDGHfc/3azY9WSjjTYCYOTIkVkP0eSIhRZaCIBHHnkE\ngOmnnx6ATTfdFIDhw4c3bCxWdo0xxhhjTMsyzr/VuLxXs+IGGhhLfRg2bBgQFK1yaIyrrLJK22uP\nPvpoVdtuhkn+FFNMAcD1118PQI8ePapex6yzzgrA559/nsqYRJ6aBkw22WQAXHvttQAsu+yybe/N\nNNNMBT/z6quvArDoooumMoZGzof2gwEDBgCw6qqrAkHZveiii4AQAfj222/r2l4t5Gn/KIWOsd9/\n/x2AP/74I7Nt5dEUfrzxxgPgiiuuAIKi+9VXXwHw66+/AtCpUycARo8eDYSoUj3kcT6SSKGSwrnO\nOuuUXP7jjz9u+32nnXYC4L777qtoW82cDylwYpNNNgFg4403jr1eTtkV66+/PgD33HNP22sLL7ww\nEFRAvffDDz8UXEdH2D8aSZ7mY6qppgLgwAMPBML/O3k9vfnmm4Gg+J577rmpjcFNJYwxxhhjzFhH\nh87ZnXDCCQG4+uqrAVhxxRWByp90MhK1M0NPTcq/TSq6UiVPPPFEAI4++ui29+aZZ57YskOGDAFC\n7uo555yTwYibg5R+Kd/LL798xZ+ddtppAdhrr72AsG8VUxnywOGHHw7AEUccAYTjQkil23PPPQFY\nYoklADj11FPbltlhhx2A9sfEc889B4Rcu+effz7VsTebSSedFIA11lgDCHnd/fr1A4LycNxxxwHw\nwAMPNHqITWGLLbYAgqL79ddfA7D22msD8N133wFw/PHHA0EB3GabbYBwjmoVxh//v0vlkUceCQTF\navHFF6/o87PNNlvb74okVqrsNgOd/8466ywgvdqOU045BYgru3369AHCeezCCy8EYJ999kllm42g\nc+fOAMw888w1ff7JJ59McTSNR9ecq666CoBevXqVXF6RAd3DKDJw9tlnZzVEK7vGGGOMMaZ18c2u\nMcYYY4xpWTpkgZqKqxQqW2211Uou/+OPPwIwZswYAJZeemkgFDBFP5/nAjXZ3CSTuRVqP/bYY4FQ\n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\nRU5ErkJggg==\n",
       "text": [
        "<matplotlib.figure.Figure at 0x10cd8a860>"
       ]
      }
     ],
     "prompt_number": 4
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "rnd = np.random.randn(784, 500)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 5
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "def inplace_relu(X, offset=0, copy=False):\n",
      "    if copy:\n",
      "        X = X.copy()\n",
      "    #X -= offset\n",
      "    X[X < offset] = 0\n",
      "    return X"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [],
     "prompt_number": 43
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "plt.hist(np.dot(X_train, rnd).ravel(), bins=50);"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "iVBORw0KGgoAAAANSUhEUgAAAZEAAAEACAYAAAByG0uxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3X9Mk3meB/B3CewlmxmomBG0ZcPQPhUVLMwOLf9MDmRb\nzt0TnQUENiPcjF5OkjPO3YSY2dzM4B8MuhcvGWddb3MZI/rH4GmyQi4WcTibMbe3nfFX7k4vG+/o\naFsrN1tahpldKNjP/cH4rNgK9kEp1fcreRL4PM/36adQ+u7zPN8WnYgIiIiINMhIdQNERJS+GCJE\nRKQZQ4SIiDRjiBARkWYMESIi0owhQkREms0ZIhMTE7Db7SgrK8PatWvx9ttvAwA6OzthNBpRXl6O\n8vJyuFwudUx3dzcURUFxcTEGBwfV+qVLl1BaWgpFUbB79261Pjk5iaamJiiKgsrKSty8eVNd19PT\nA4vFAovFgmPHjql1r9cLu90ORVHQ3NyMqamphf8kiIgoeTKPb775RkREpqamxG63y4ULF6Szs1MO\nHDgQt+21a9fEarVKNBoVr9crJpNJYrGYiIhUVFSIx+MREZGNGzeKy+USEZFDhw5Je3u7iIj09vZK\nU1OTiIiEQiEpKiqScDgs4XBYioqKJBKJiIhIY2OjnDhxQkREdu7cKYcPH57vbhAR0RMw7+ms7373\nuwCAaDSKu3fvYtmyZffCJ27bvr4+tLS0ICsrC4WFhTCbzfB4PAgGgxgfH4fNZgMAtLa24vTp0wCA\n/v5+tLW1AQDq6+sxNDQEADh79iycTif0ej30ej0cDgdcLhdEBOfPn0dDQwMAoK2tTd0XEREtrnlD\nJBaLoaysDHl5eaiursa6desAAB9++CGsViu2b9+OSCQCALh9+zaMRqM61mg0IhAIxNUNBgMCgQAA\nIBAIoKCgAACQmZmJnJwchEKhh+5rdHQUer0eGRkZcfsiIqLFNW+IZGRk4OrVq/D7/fj000/hdrvR\n3t4Or9eLq1evYuXKlXjrrbcWo1fodLpFuR0iIno0mY+6YU5ODn70ox/h4sWLqKqqUus7duzApk2b\nAMwcFfh8PnWd3++H0WiEwWCA3++Pq98bc+vWLaxatQrT09MYGxvD8uXLYTAY4Ha71TE+nw8bNmxA\nbm4uIpEIYrEYMjIy4Pf7YTAY4vo1m8343//930f+QRAREWAymfA///M/jz5grgsmX375pYTDYRER\n+f3vfy+vvPKKfPLJJxIMBtVt/uEf/kFaWlpE5I8X1icnJ2V4eFiKiorUC+s2m01+85vfSCwWi7uw\nvnPnThER+fjjj2ddWH/xxRclHA7L6Oio+rXIzIX13t5eERH5q7/6q4QX1ue5a0vee++9l+oWFoT9\np1Y695/OvYukf//JPnfOeSQSDAbR1taGWCyGWCyGbdu2oaamBq2trbh69Sp0Oh1efPFF/PKXvwQA\nrF27Flu3bsXatWuRmZmJX/ziF+opqF/84hf4i7/4C/zhD3/AD3/4Q/zZn/0ZAGD79u3Ytm0bFEXB\n8uXL0dvbCwDIzc3FO++8g4qKCgDAe++9B71eDwDYv38/mpub8Xd/93d46aWXsH379mSCloiIHpM5\nQ6S0tBSXL1+Oq9//no0H/fSnP8VPf/rTuPr3v/99/Od//mdc/U/+5E/wz//8zwn39frrr+P111+P\nq7/44ovweDxztU5ERIuA71hfou6/7pSO2H9qpXP/6dw7kP79J0v37Tmwp45Op0v4XhYiInq4ZJ87\neSRCRESaMUSIiEgzhggREWnGECEiIs0YIkREpBlDhIiINGOIEBGRZgwRIiLSjCFCRESaMUSIiEgz\nhggREWnGECF6imRn50Kn08Ut2dm5qW6NnlL8AEaip8jM/+9J9Ljn3wM9Gn4AI9Ez4GFHHESLjUci\nRGloriMOHonQQvBIhIiIFg1DhIiINGOIEBGRZgwRIiLSjCFCRESaMUSIiEizOUNkYmICdrsdZWVl\nWLt2Ld5++20AwOjoKBwOBywWC5xOJyKRiDqmu7sbiqKguLgYg4ODav3SpUsoLS2FoijYvXu3Wp+c\nnERTUxMURUFlZSVu3rypruvp6YHFYoHFYsGxY8fUutfrhd1uh6IoaG5uxtTU1MJ/EkRElDyZxzff\nfCMiIlNTU2K32+XChQvS0dEh+/fvFxGRffv2yZ49e0RE5Nq1a2K1WiUajYrX6xWTySSxWExERCoq\nKsTj8YiIyMaNG8XlcomIyKFDh6S9vV1ERHp7e6WpqUlEREKhkBQVFUk4HJZwOCxFRUUSiURERKSx\nsVFOnDghIiI7d+6Uw4cPx/X9CHeNKG0BEEASLA+vEz2KZB8r857O+u53vwsAiEajuHv3LpYtW4b+\n/n60tbUBANra2nD69GkAQF9fH1paWpCVlYXCwkKYzWZ4PB4Eg0GMj4/DZrMBAFpbW9Ux9++rvr4e\nQ0NDAICzZ8/C6XRCr9dDr9fD4XDA5XJBRHD+/Hk0NDTE3T4RES2ueUMkFouhrKwMeXl5qK6uxrp1\n6zAyMoK8vDwAQF5eHkZGRgAAt2/fhtFoVMcajUYEAoG4usFgQCAQAAAEAgEUFBQAADIzM5GTk4NQ\nKPTQfY2OjkKv1yMjIyNuX0REtLgy59sgIyMDV69exdjYGGpra3H+/PlZ6xfzM3uSvZ3Ozk7166qq\nKlRVVT3ehoiI0pzb7Ybb7dY8ft4QuScnJwc/+tGPcOnSJeTl5eHOnTvIz89HMBjEihUrAMwcFfh8\nPnWM3++H0WiEwWCA3++Pq98bc+vWLaxatQrT09MYGxvD8uXLYTAYZt0xn8+HDRs2IDc3F5FIBLFY\nDBkZGfD7/TAYDAl7vj9EiJ5tmQlfhD3//DJ89dVoCvqhpeLBF9h79+5Navycp7N+97vfqTOv/vCH\nP+DcuXMoLy9HXV0denp6AMzMoNqyZQsAoK6uDr29vYhGo/B6vbhx4wZsNhvy8/ORnZ0Nj8cDEcHx\n48exefNmdcy9fZ06dQo1NTUAAKfTicHBQUQiEYTDYZw7dw61tbXQ6XSorq7GyZMn426fiB5mGjMf\nzDh7GR8Pp7QregrMddX9P/7jP6S8vFysVquUlpbKz372MxGZmTlVU1MjiqKIw+GQcDisjunq6hKT\nySSrV6+WgYEBtX7x4kUpKSkRk8kku3btUusTExPS2NgoZrNZ7Ha7eL1edd2RI0fEbDaL2WyWo0eP\nqvXh4WGx2WxiNptl69atEo1GFzzDgCidQMPsLM7aokeR7GOCHwVPlIa0fBQ8PyKeHgU/Cp6IiBYN\nQ4RoCeN/MKSljqeziJawx3naiqez6FHwdBYRES0ahggREWnGECEiIs0YIkREpBlDhIiINGOIEBGR\nZgwRIiLSjCFCRESaMUSIiEgzhggREWnGECEiIs0YIkREpBlDhIiINGOIEBGRZgwRIiLSjCFCRESa\nMUSIiEgzhggREWnGECEiIs0YIkREpNmcIeLz+VBdXY1169ahpKQEBw8eBAB0dnbCaDSivLwc5eXl\ncLlc6pju7m4oioLi4mIMDg6q9UuXLqG0tBSKomD37t1qfXJyEk1NTVAUBZWVlbh586a6rqenBxaL\nBRaLBceOHVPrXq8XdrsdiqKgubkZU1NTC/9JEBFR8mQOwWBQrly5IiIi4+PjYrFY5Pr169LZ2SkH\nDhyI2/7atWtitVolGo2K1+sVk8kksVhMREQqKirE4/GIiMjGjRvF5XKJiMihQ4ekvb1dRER6e3ul\nqalJRERCoZAUFRVJOByWcDgsRUVFEolERESksbFRTpw4ISIiO3fulMOHD8f1Ms9dI0oLAASQBMvj\nqmd+u2728vzzy1J91ylFkn3unPNIJD8/H2VlZQCA5557DmvWrEEgELgXPnHb9/X1oaWlBVlZWSgs\nLITZbIbH40EwGMT4+DhsNhsAoLW1FadPnwYA9Pf3o62tDQBQX1+PoaEhAMDZs2fhdDqh1+uh1+vh\ncDjgcrkgIjh//jwaGhoAAG1tbeq+iChZ00iQIRgfD6e0K0ofj3xN5IsvvsCVK1dQWVkJAPjwww9h\ntVqxfft2RCIRAMDt27dhNBrVMUajEYFAIK5uMBjUMAoEAigoKAAAZGZmIicnB6FQ6KH7Gh0dhV6v\nR0ZGRty+iIhocWU+ykZff/01Ghoa8MEHH+C5555De3s73n33XQDAO++8g7feegsfffTRE20UAHQ6\nXVLbd3Z2ql9XVVWhqqrq8TZERJTm3G433G635vHzhsjU1BTq6+vx2muvYcuWLQCAFStWqOt37NiB\nTZs2AZg5KvD5fOo6v98Po9EIg8EAv98fV7835tatW1i1ahWmp6cxNjaG5cuXw2AwzLpjPp8PGzZs\nQG5uLiKRCGKxGDIyMuD3+2EwGBL2fn+IEBFRvAdfYO/duzep8XOezhIRbN++HWvXrsWbb76p1oPB\noPr1r371K5SWlgIA6urq0Nvbi2g0Cq/Xixs3bsBmsyE/Px/Z2dnweDwQERw/fhybN29Wx/T09AAA\nTp06hZqaGgCA0+nE4OAgIpEIwuEwzp07h9raWuh0OlRXV+PkyZMAZmZw3Qs3IiJaZHNddb9w4YLo\ndDqxWq1SVlYmZWVlcubMGdm2bZuUlpbK+vXrZfPmzXLnzh11TFdXl5hMJlm9erUMDAyo9YsXL0pJ\nSYmYTCbZtWuXWp+YmJDGxkYxm81it9vF6/Wq644cOSJms1nMZrMcPXpUrQ8PD4vNZhOz2Sxbt26V\naDS64BkGREsRnvjsrIfX6dmU7O9e9+2gp45Op0s4g4xoqcrOzn3IrKhEj2PdE6/z7+fZlOxzJ0OE\naImYmTjy4GP2yYcFQ4Tul+xzJz/2hIiINGOIEBGRZgwRIiLSjCFCRESaMUSIiEgzhggREWnGECEi\nIs0YIkREpBlDhIiINGOIEBGRZgwRIiLSjCFCRESaMUSIiEgzhggREWnGECEiIs0YIkREpBlDhIiI\nNGOIEBGRZgwRIiLSjCFCRESaMUSIiEgzhggREWk2Z4j4fD5UV1dj3bp1KCkpwcGDBwEAo6OjcDgc\nsFgscDqdiEQi6pju7m4oioLi4mIMDg6q9UuXLqG0tBSKomD37t1qfXJyEk1NTVAUBZWVlbh586a6\nrqenBxaLBRaLBceOHVPrXq8XdrsdiqKgubkZU1NTC/9JEBFR8mQOwWBQrly5IiIi4+PjYrFY5Pr1\n69LR0SH79+8XEZF9+/bJnj17RETk2rVrYrVaJRqNitfrFZPJJLFYTEREKioqxOPxiIjIxo0bxeVy\niYjIoUOHpL29XUREent7pampSUREQqGQFBUVSTgclnA4LEVFRRKJREREpLGxUU6cOCEiIjt37pTD\nhw/H9T7PXSNacgAIIA8siWqLU6dnU7K/+zmPRPLz81FWVgYAeO6557BmzRoEAgH09/ejra0NANDW\n1obTp08DAPr6+tDS0oKsrCwUFhbCbDbD4/EgGAxifHwcNpsNANDa2qqOuX9f9fX1GBoaAgCcPXsW\nTqcTer0eer0eDocDLpcLIoLz58+joaEh7vaJ6HHJhE6nm7VkZ+emuilagh75msgXX3yBK1euwG63\nY2RkBHl5eQCAvLw8jIyMAABu374No9GojjEajQgEAnF1g8GAQCAAAAgEAigoKAAAZGZmIicnB6FQ\n6KH7Gh0dhV6vR0ZGRty+iOhxmQYgs5bx8XBqW6IlKfNRNvr6669RX1+PDz74AM8///ysdfdepSyG\nZG+ns7NT/bqqqgpVVVWPtyEiojTndrvhdrs1j583RKamplBfX49t27Zhy5YtAGaOPu7cuYP8/HwE\ng0GsWLECwMxRgc/nU8f6/X4YjUYYDAb4/f64+r0xt27dwqpVqzA9PY2xsTEsX74cBoNh1h3z+XzY\nsGEDcnNzEYlEEIvFkJGRAb/fD4PBkLD3+0OEiIjiPfgCe+/evUmNn/N0lohg+/btWLt2Ld588021\nXldXh56eHgAzM6juhUtdXR16e3sRjUbh9Xpx48YN2Gw25OfnIzs7Gx6PByKC48ePY/PmzXH7OnXq\nFGpqagAATqcTg4ODiEQiCIfDOHfuHGpra6HT6VBdXY2TJ0/G3T4RES2yua66X7hwQXQ6nVitVikr\nK5OysjJxuVwSCoWkpqZGFEURh8Mh4XBYHdPV1SUmk0lWr14tAwMDav3ixYtSUlIiJpNJdu3apdYn\nJiaksbFRzGaz2O128Xq96rojR46I2WwWs9ksR48eVevDw8Nis9nEbDbL1q1bJRqNLniGAVGqYYnN\nzuKMrWdTsr9n3beDnjo6nQ5P6V2jp9TMNb8HH7OJaqmq82/qWZDscyffsU5ERJoxRIgWWXZ2btx7\nMBZrhiPR48bTWUSLLPFpK+Bhp5B4OosWE09nERHRomGIEBGRZgwRIiLSjCFCRESaMUSIiEgzhggR\nEWnGECEiIs0YIkREpBlDhIiINGOIEBGRZgwRIiLSjCFCRESaMUSIiEgzhggREWnGECEiIs0YIkRE\npBlDhIiINGOIEBGRZgwRIiLSjCFCRESazRsib7zxBvLy8lBaWqrWOjs7YTQaUV5ejvLycrhcLnVd\nd3c3FEVBcXExBgcH1fqlS5dQWloKRVGwe/dutT45OYmmpiYoioLKykrcvHlTXdfT0wOLxQKLxYJj\nx46pda/XC7vdDkVR0NzcjKmpKe0/ASIi0k7m8emnn8rly5elpKRErXV2dsqBAwfitr127ZpYrVaJ\nRqPi9XrFZDJJLBYTEZGKigrxeDwiIrJx40ZxuVwiInLo0CFpb28XEZHe3l5pamoSEZFQKCRFRUUS\nDoclHA5LUVGRRCIRERFpbGyUEydOiIjIzp075fDhw3G9PMJdI0oJAAJIgiVRPZltn3Sdf1PPgmR/\nz/MeibzyyitYtmxZovCJq/X19aGlpQVZWVkoLCyE2WyGx+NBMBjE+Pg4bDYbAKC1tRWnT58GAPT3\n96OtrQ0AUF9fj6GhIQDA2bNn4XQ6odfrodfr4XA44HK5ICI4f/48GhoaAABtbW3qvojoScqETqeL\nW7Kzc1PdGKWQ5msiH374IaxWK7Zv345IJAIAuH37NoxGo7qN0WhEIBCIqxsMBgQCAQBAIBBAQUEB\nACAzMxM5OTkIhUIP3dfo6Cj0ej0yMjLi9kVET9I0AIlbxsfDKe2KUitTy6D29na8++67AIB33nkH\nb731Fj766KPH2lgiOp0uqe07OzvVr6uqqlBVVfV4GyIiSnNutxtut1vzeE0hsmLFCvXrHTt2YNOm\nTQBmjgp8Pp+6zu/3w2g0wmAwwO/3x9Xvjbl16xZWrVqF6elpjI2NYfny5TAYDLPumM/nw4YNG5Cb\nm4tIJIJYLIaMjAz4/X4YDIaEfd4fIkREFO/BF9h79+5Narym01nBYFD9+le/+pU6c6uurg69vb2I\nRqPwer24ceMGbDYb8vPzkZ2dDY/HAxHB8ePHsXnzZnVMT08PAODUqVOoqakBADidTgwODiISiSAc\nDuPcuXOora2FTqdDdXU1Tp48CWBmBteWLVu03A0iIlqo+a68Nzc3y8qVKyUrK0uMRqN89NFHsm3b\nNiktLZX169fL5s2b5c6dO+r2XV1dYjKZZPXq1TIwMKDWL168KCUlJWIymWTXrl1qfWJiQhobG8Vs\nNovdbhev16uuO3LkiJjNZjGbzXL06FG1Pjw8LDabTcxms2zdulWi0eiCZxgQLRak8eysh21LT49k\nf5+6bwc9dXQ6XcIZZESpNnNtL9FjM1E9mW2fdP3h2/Jv7emR7HMn37FORESaMUSInpDs7NyE76sg\neprwdBbRE5LcaauH1Xk6ixYXT2cREdGiYYgQEZFmDBEiItKMIUJERJoxRIiISDOGCBERacYQISIi\nzRgiRESkGUOEiIg0Y4gQEZFmDBEiItKMIUJERJoxRIiISDOGCBERacYQISIizRgiRESkGUOEiIg0\nY4gQEZFmDBEiWqDMhP9LPjs7N9WN0SLITHUDRJTuppHof6+Pj+sWvxVadPMeibzxxhvIy8tDaWmp\nWhsdHYXD4YDFYoHT6UQkElHXdXd3Q1EUFBcXY3BwUK1funQJpaWlUBQFu3fvVuuTk5NoamqCoiio\nrKzEzZs31XU9PT2wWCywWCw4duyYWvd6vbDb7VAUBc3NzZiamtL+EyAiIu1kHp9++qlcvnxZSkpK\n1FpHR4fs379fRET27dsne/bsERGRa9euidVqlWg0Kl6vV0wmk8RiMRERqaioEI/HIyIiGzduFJfL\nJSIihw4dkvb2dhER6e3tlaamJhERCYVCUlRUJOFwWMLhsBQVFUkkEhERkcbGRjlx4oSIiOzcuVMO\nHz4c1/cj3DWiJwqAAJJgSab+OPaRul4o/ST7e5v3SOSVV17BsmXLZtX6+/vR1tYGAGhra8Pp06cB\nAH19fWhpaUFWVhYKCwthNpvh8XgQDAYxPj4Om80GAGhtbVXH3L+v+vp6DA0NAQDOnj0Lp9MJvV4P\nvV4Ph8MBl8sFEcH58+fR0NAQd/tERLS4NF1YHxkZQV5eHgAgLy8PIyMjAIDbt2/DaDSq2xmNRgQC\ngbi6wWBAIBAAAAQCARQUFAAAMjMzkZOTg1Ao9NB9jY6OQq/XIyMjI25fRES0uBZ8Yf3eTIzFkOzt\ndHZ2ql9XVVWhqqrq8TZERJTm3G433G635vGaQiQvLw937txBfn4+gsEgVqxYAWDmqMDn86nb+f1+\nGI1GGAwG+P3+uPq9Mbdu3cKqVaswPT2NsbExLF++HAaDYdYd8/l82LBhA3JzcxGJRBCLxZCRkQG/\n3w+DwZCwz/tDhOhJyc7Oxfh4ONVtEGny4AvsvXv3JjVe0+msuro69PT0AJiZQbVlyxa13tvbi2g0\nCq/Xixs3bsBmsyE/Px/Z2dnweDwQERw/fhybN2+O29epU6dQU1MDAHA6nRgcHEQkEkE4HMa5c+dQ\nW1sLnU6H6upqnDx5Mu72iVJhJkAkwUL0DJjvyntzc7OsXLlSsrKyxGg0ypEjRyQUCklNTY0oiiIO\nh0PC4bC6fVdXl5hMJlm9erUMDAyo9YsXL0pJSYmYTCbZtWuXWp+YmJDGxkYxm81it9vF6/Wq644c\nOSJms1nMZrMcPXpUrQ8PD4vNZhOz2Sxbt26VaDS64BkGRFphic2IWkq9UPpJ9vem+3bQU0en0+Ep\nvWu0xMxcq0v0WHsc9Se57yffC/8G00+yz5382BMiItKMIUJERJoxRIiISDOGCBERacYQISIizRgi\nRESkGUOEiIg0Y4gQEZFmDBEiItKMIUJERJoxRIiISDOGCBE9IZnq/xu6f8nOzk11Y/QYLfifUhER\nJTaNRB/MOD6+OP/EjhYHj0SIiEgzhggREWnGECEiIs0YIkREpBlDhOgRZWfnJpxtRPQs4+wsokc0\nPh7Gw/89LNGziUciRESkGUOEiIg0Y4gQEZFmDBEiItJsQSFSWFiI9evXo7y8HDabDQAwOjoKh8MB\ni8UCp9OJSCSibt/d3Q1FUVBcXIzBwUG1funSJZSWlkJRFOzevVutT05OoqmpCYqioLKyEjdv3lTX\n9fT0wGKxwGKx4NixYwu5G0REpJUsQGFhoYRCoVm1jo4O2b9/v4iI7Nu3T/bs2SMiIteuXROr1SrR\naFS8Xq+YTCaJxWIiIlJRUSEej0dERDZu3Cgul0tERA4dOiTt7e0iItLb2ytNTU0iIhIKhaSoqEjC\n4bCEw2H16/st8K4RxQEggCRYnmQ9Fbf55HuhpSvZ38+CT2fN3OYf9ff3o62tDQDQ1taG06dPAwD6\n+vrQ0tKCrKwsFBYWwmw2w+PxIBgMYnx8XD2SaW1tVcfcv6/6+noMDQ0BAM6ePQun0wm9Xg+9Xg+H\nw4GBgYGF3hUiIkrSgkJEp9PhBz/4AV5++WX80z/9EwBgZGQEeXl5AIC8vDyMjIwAAG7fvg2j0aiO\nNRqNCAQCcXWDwYBAIAAACAQCKCgoAABkZmYiJycHoVDoofsiIqLFtaA3G/7bv/0bVq5ciS+//BIO\nhwPFxcWz1qf6Hb2dnZ3q11VVVaiqqkpZL0R0T2bC54Xnn1+Gr74aTUE/zza32w232615/IJCZOXK\nlQCAF154Aa+++io+++wz5OXl4c6dO8jPz0cwGMSKFSsAzBxh+Hw+dazf74fRaITBYIDf74+r3xtz\n69YtrFq1CtPT0xgbG8Py5cthMBhm3Wmfz4cNGzbE9Xd/iBDRUsH/M7KUPPgCe+/evUmN13w66/e/\n/z3Gx8cBAN988w0GBwdRWlqKuro69PT0AJiZQbVlyxYAQF1dHXp7exGNRuH1enHjxg3YbDbk5+cj\nOzsbHo8HIoLjx49j8+bN6ph7+zp16hRqamoAAE6nE4ODg4hEIgiHwzh37hxqa2u13hUiItJK6xX8\n4eFhsVqtYrVaZd26dfL++++LyMzMqZqaGlEURRwOx6xZU11dXWIymWT16tUyMDCg1i9evCglJSVi\nMplk165dan1iYkIaGxvFbDaL3W4Xr9errjty5IiYzWYxm81y9OjRuP4WcNeIEkKaz4hKh14o9ZL9\nPei+HfTU0el0cTPHiBZi5jx+osfUk6yn4jZT1wv/ZlMv2edOvmOdKIFEH/tORPH4UfBECST+2HcG\nCdGDeCRCRESaMUSIiEgzhggREWnGECEiIs0YIkREpBlDhIiWiMy4adXZ2bmpbormwSm+RLRExH+m\nFj9Pa+njkQgREWnGEKFnWqJ3pvPd6USPjqez6JmW+J3pAN+dTvRoeCRCRESaMUSIiEgzhggRLWHx\n03459Xdp4TURIlrC+K90lzoeiRARkWYMEXomcCov0ZPB01n0TOBUXqIng0ciRJSGeMF9qeCRCBGl\nIV5wXyp4JEJPFV77IFpcaRsiAwMDKC4uhqIo2L9/f6rboSXij9c+HlyI6ElIyxC5e/cu/vqv/xoD\nAwO4fv06Pv74Y/z3f/93qtt6rNxud6pbWJB07z/9uVPdwAK4FzA29ddKnrXHflqGyGeffQaz2YzC\nwkJkZWWhubkZfX19qW7rsUr3B+KT7p+nrebjTnUDC+BewNh710pmL+Pj44sWLun+t5ustAyRQCCA\ngoIC9XvLQePLAAAGm0lEQVSj0YhAIJDCjuhJeVhY8LQVJedh4RJOaVdPg7QMkXR4xfnrX/864ZOf\nTqfDlStXUt1eSj0sGHS67zAsaJElOv0V/zicq/7MTyuWNPTv//7vUltbq37//vvvy759+2ZtYzKZ\nEj3zcOHChQuXORaTyZTU87FORARpZnp6GqtXr8bQ0BBWrVoFm82Gjz/+GGvWrEl1a0REz5S0fLNh\nZmYmfv7zn6O2thZ3797F9u3bGSBERCmQlkciRES0NKTlhfW5fPbZZ7DZbCgvL0dFRQU+//xzdV13\ndzcURUFxcTEGBwdT2OXcPvzwQ6xZswYlJSXYs2ePWk+X/g8cOICMjAyMjo6qtXTovaOjA2vWrIHV\nasWPf/xjjI2NqevSoX8g/d6E6/P5UF1djXXr1qGkpAQHDx4EAIyOjsLhcMBiscDpdCISiaS407nd\nvXsX5eXl2LRpE4D06j8SiaChoQFr1qzB2rVr4fF4kut/wVe5l5g//dM/lYGBAREROXPmjFRVVYmI\nyLVr18RqtUo0GhWv1ysmk0nu3r2bylYT+td//Vf5wQ9+INFoVERE/u///k9E0qf/W7duSW1trRQW\nFkooFBKR9Ol9cHBQ7WvPnj2yZ88eEUmf/qenp8VkMonX65VoNCpWq1WuX7+e6rbmFAwG5cqVKyIi\nMj4+LhaLRa5fvy4dHR2yf/9+ERHZt2+f+rtYqg4cOCA/+clPZNOmTSIiadV/a2urfPTRRyIiMjU1\nJZFIJKn+n7ojkZUrV6qvICORCAwGAwCgr68PLS0tyMrKQmFhIcxmMz777LNUtprQ4cOH8fbbbyMr\nKwsA8MILLwBIn/7/9m//Fj/72c9m1dKld4fDgYyMmT8Ju90Ov98PIH36T8c34ebn56OsrAwA8Nxz\nz2HNmjUIBALo7+9HW1sbAKCtrQ2nT59OZZtz8vv9OHPmDHbs2AH59upAuvQ/NjaGCxcu4I033gAw\nc705Jycnqf6fuhDZt28f3nrrLXzve99DR0cHuru7AQC3b9+G0WhUt1uqb1C8ceMGPv30U1RWVqKq\nqgoXL14EkB799/X1wWg0Yv369bPq6dD7g44cOYIf/vCHANKn/3R/E+4XX3yBK1euwG63Y2RkBHl5\neQCAvLw8jIyMpLi7h/ubv/kb/P3f/736AgRA2vTv9Xrxwgsv4PXXX8dLL72Ev/zLv8Q333yTVP9p\nOTvL4XDgzp07cfWuri4cPHgQBw8exKuvvoqTJ0/ijTfewLlz5xLuJ1VvWpyr/+npaYTDYfzmN7/B\n559/jq1bt2J4eDjhflLR/1y9d3d3z7peIHPM2VhqP/v3339fPZ/d1dWF73znO/jJT37y0P0sxTe8\nLsWeHtXXX3+N+vp6fPDBB3j++ednrVvKH2nzL//yL1ixYgXKy8sf+nEnS7n/6elpXL58GT//+c9R\nUVGBN998E/v27Zu1zXz9p2WIPCwUAOC1117DJ598AgBoaGjAjh07AAAGgwE+n0/dzu/3q6e6Fttc\n/R8+fBg//vGPAQAVFRXIyMjA7373uyXT/8N6/6//+i94vV5YrVYAM/19//vfh8fjWTK9A3P/7AHg\n6NGjOHPmDIaGhtTaUup/Lg/26fP5Zh1BLVVTU1Oor6/Htm3bsGXLFgAzr37v3LmD/Px8BINBrFix\nIsVdJvbrX/8a/f39OHPmDCYmJvDVV19h27ZtadO/0WiE0WhERUUFgJnnzO7ubuTn5z96/4tw3WZR\nlZeXi9vtFhGRTz75RF5++WUR+ePF0cnJSRkeHpaioiKJxWKpbDWhf/zHf5R3331XRER++9vfSkFB\ngYikT//3JLqwvtR7d7lcsnbtWvnyyy9n1dOl/6mpKSkqKhKv1yuTk5NpcWE9FovJtm3b5M0335xV\n7+joUD+Foru7e0lfmL7H7XbLn//5n4tIevX/yiuvyG9/+1sREXnvvfeko6Mjqf6fuhD5/PPPxWaz\nidVqlcrKSrl8+bK6rqurS0wmk6xevVqdwbXURKNRee2116SkpEReeuklOX/+vLouHfq/58UXX1RD\nRCQ9ejebzfK9731PysrKpKysTNrb29V16dC/yMyMRIvFIiaTSd5///1UtzOvCxcuiE6nE6vVqv7c\nXS6XhEIhqampEUVRxOFwSDgcTnWr83K73ersrHTq/+rVq/Lyyy/L+vXr5dVXX5VIJJJU/3yzIRER\nafbUzc4iIqLFwxAhIiLNGCJERKQZQ4SIiDRjiBARkWYMESIi0owhQkREmjFEiIhIs/8HTGHQW2ol\nJb0AAAAASUVORK5CYII=\n",
       "text": [
        "<matplotlib.figure.Figure at 0x10cc659e8>"
       ]
      }
     ],
     "prompt_number": 44
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "np.median(np.dot(X_train, rnd).ravel())"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 49,
       "text": [
        "-0.3353977893920973"
       ]
      }
     ],
     "prompt_number": 49
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "X_proj = np.dot(X_train, rnd)\n",
      "X_proj_relu = inplace_relu(X_proj, offset=2.)\n",
      "np.mean(X_proj_relu == 0)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 45,
       "text": [
        "0.60276743333333338"
       ]
      }
     ],
     "prompt_number": 45
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "np.linspace(-0.02, 25, 10)"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 46,
       "text": [
        "array([ -2.00000000e-02,   2.76000000e+00,   5.54000000e+00,\n",
        "         8.32000000e+00,   1.11000000e+01,   1.38800000e+01,\n",
        "         1.66600000e+01,   1.94400000e+01,   2.22200000e+01,\n",
        "         2.50000000e+01])"
       ]
      }
     ],
     "prompt_number": 46
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "offsets = [-0.001, 0, 5, 10, 20, 25]\n",
      "sparsity = [np.mean(inplace_relu(X_proj, offset=o, copy=True) == 0) for o in offsets]\n",
      "plt.plot(offsets, sparsity, 'o-')"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 47,
       "text": [
        "[<matplotlib.lines.Line2D at 0x10ddd2ef0>]"
       ]
      },
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x10d3d27b8>"
       ]
      }
     ],
     "prompt_number": 47
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from sklearn.base import BaseEstimator, TransformerMixin\n",
      "from sklearn.utils import check_random_state\n",
      "\n",
      "class ReLUProjector(BaseEstimator, TransformerMixin):\n",
      "    \n",
      "    def __init__(self, n_components=100, offset=0, random_state=None):\n",
      "        self.n_components = n_components\n",
      "        self.offset = offset\n",
      "        self.random_state = random_state\n",
      "        \n",
      "    def fit(self, X):\n",
      "        rng = check_random_state(self.random_state)\n",
      "        n_samples, n_features = X.shape\n",
      "        self.components_ = rng.randn(self.n_components, n_features)\n",
      "        \n",
      "    def transform(self, X):\n",
      "        X_proj = np.dot(X, self.components_.T)\n",
      "        "
     ],
     "language": "python",
     "metadata": {},
     "outputs": []
    }
   ],
   "metadata": {}
  }
 ]
}